package com.pi.base.util;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import com.pi.base.constant.SysStatics;
import com.pi.base.entity.SysUser;

public class SysAuthUtil {

	/**
	 * 判断登录的用户是否包含btnCode按钮权限。
	 * 
	 * @param request
	 * @param btnCode
	 * @return
	 */
	public static boolean ifBtn(HttpServletRequest request, String btnCode) {
		SysUser loginedUser = (SysUser) SessionUtil.getSessionAttribute(request, SysStatics.WEB_USER_SESSION );
		if (loginedUser.getSuperadmin() == 1) {
			return true;
		}
		String buttons = (String) SessionUtil.getSessionAttribute(request, SysStatics.WEB_BTNAUTH_SESSION);
		if (buttons.contains("," + btnCode + ",")) {
			return true;
		}
		return false;
	}

	/**
	 * 向新list中装入根节点并递归子节点
	 * 
	 * @param <T>
	 * @param treeList
	 *            待转化的对象列表
	 * @param nodeClass
	 *            待转换的对象实体的Class
	 * @param rootId
	 *            根部对象的ID
	 * @param getIdMethod
	 *            获取ID的方法名
	 * @param getParentIdMethod
	 *            获取parentID的方法名
	 * @param setSubMethod
	 *            设置subList的方法名
	 * @return 返回包含根部对象的列表
	 */
	public static <T> List<T> turnListToTreeList(List<T> treeList, Class<T> nodeClass, String rootMethod, String rootId, String getIdMethod, String getParentIdMethod, String setSubMethod) {
		List<T> rootNodes = new ArrayList<T>();
		try {
			// 获取最顶层的对象列表
			rootNodes = getRootNodes(treeList, nodeClass, rootMethod, rootId);
			for (T rootNode : rootNodes) {
				// 循环查找每个节点对象的子列表，并调用SetSubList方法设置。
				sortNode(rootNode, treeList, nodeClass, getIdMethod, getParentIdMethod, setSubMethod);
			}
		} catch (Exception e) {
			System.out.println("反射錯誤");
			e.printStackTrace();
		}
		return rootNodes;
	}

	/**
	 * 获取最顶层的对象列表。
	 */
	private static <T> List<T> getRootNodes(List<T> treeList, Class<T> c, String rootMethod, String rootId) throws Exception {
		List<T> rootList = new ArrayList<T>();
		Method me = c.getMethod(rootMethod);
		for (T ts : treeList) {
			// 当parentId等于制定的rootId时
			if (((Integer) me.invoke(ts)).toString().equals(rootId)) {
				rootList.add(ts);
			}
		}
		return rootList;
	}

	/** 循环查找每个节点对象的子列表，并调用SetSubList方法设置。 */
	private static <T> List<T> sortNode(T rootNode, List<T> treeList, Class<T> c, String getIdMethod, String getParentIdMethod, String setSubMethod) throws Exception {
		// 获取子节点列表
		List<T> childList = getChild(rootNode, treeList, c, getIdMethod, getParentIdMethod);
		if (childList != null) {
			// 循环子节点列表，并查找每个子节点对象的子列表，并调用SetSubList方法设置。
			for (T childNode : childList) {
				sortNode(childNode, treeList, c, getIdMethod, getParentIdMethod, setSubMethod);
			}
			// 调用SetSubList方法设置。
			Method idMe = c.getMethod(setSubMethod, List.class);
			idMe.invoke(rootNode, childList);
		}
		return childList;
	}

	/** 获取节点的子节点列表 */
	private static <T> List<T> getChild(T treeNode, List<T> treeList, Class<T> c, String getIdMethod, String getParentIdMethod) throws Exception {
		List<T> childList = new ArrayList<T>();
		Method idMe = c.getMethod(getIdMethod);
		Method pIdMe = c.getMethod(getParentIdMethod);
		for (T ts : treeList) {
			// 当有节点的ParentId等于节点treeNode的Id时，说明是其子节点，将其加入子节点列表中。
			if (((Integer) idMe.invoke(treeNode)).toString().equals(((Integer) pIdMe.invoke(ts)).toString())) {
				childList.add(ts);
			}
		}
		return childList;
	}

}
